package cn.edu.sgu.www.mhxysy.strategy.login.impl;

import cn.edu.sgu.www.mhxysy.chain.login.impl.CaptchaHandler;
import cn.edu.sgu.www.mhxysy.chain.login.impl.EmailSendHandler;
import cn.edu.sgu.www.mhxysy.chain.login.impl.ShiroLoginHandler;
import cn.edu.sgu.www.mhxysy.chain.login.impl.UserUpdateHandler;
import cn.edu.sgu.www.mhxysy.dto.system.UserLoginDTO;
import cn.edu.sgu.www.mhxysy.strategy.login.LoginStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
@Slf4j
@Component
public class ShiroLoginStrategy implements LoginStrategy {

    private UserLoginDTO loginDTO;

    private final CaptchaHandler captchaHandler;
    private final EmailSendHandler emailSendHandler;
    private final UserUpdateHandler userUpdateHandler;
    private final ShiroLoginHandler shiroLoginHandler;

    public ShiroLoginStrategy(
            CaptchaHandler captchaHandler,
            EmailSendHandler emailSendHandler,
            UserUpdateHandler userUpdateHandler,
            ShiroLoginHandler shiroLoginHandler) {
        this.captchaHandler = captchaHandler;
        this.emailSendHandler = emailSendHandler;
        this.userUpdateHandler = userUpdateHandler;
        this.shiroLoginHandler = shiroLoginHandler;
    }

    @Override
    public void setLoginDTO(UserLoginDTO loginDTO) {
        this.loginDTO = loginDTO;
    }

    @Override
    public void doLogin() {
        // 得到用户名
        String username = loginDTO.getUsername();

        log.debug("用户{}正在登录...", username);

        /*
         * 登录流程
         */
        // 1、验证码判断
        captchaHandler.setParams(loginDTO);
        captchaHandler.setNext(shiroLoginHandler);

        // 2、shiro登录认证
        shiroLoginHandler.setParams(loginDTO);
        shiroLoginHandler.setNext(userUpdateHandler);

        // 3、修改用户信息
        userUpdateHandler.setNext(emailSendHandler);

        // 4、邮件通知处理
        emailSendHandler.setParams(username);
        emailSendHandler.setNext(null);

        // 开始执行处理链
        captchaHandler.handle();
    }

}